<?php

namespace app\tools;

/**
 * 图片压缩类：通过缩放来压缩。
 * 如果要保持源图比例，把参数$percent保持为即可。
 * 即使原比例压缩，也可大幅度缩小。数码相机M图片。也可以缩为KB左右。如果缩小比例，则体积会更小。
 *
 * 结果：可保存、可直接显示。
 */
class Img{

  public static $src;
  public static $image;
  public static $imageinfo;
  public static $percent = 1;

  /** 高清压缩图片
   * @param string $saveName 提供图片名（可不带扩展名，用源图扩展名）用于保存。或不提供文件名直接显示
   */
  public static function compressImg($saveName='', $src='')
  {
    $image = Img::openImage($src);
    if(!empty($saveName)) Img::saveImage($saveName, $image); //保存
    else Img::showImage();
  }
  /**
   * 内部：打开图片
   */
  public static function openImage($src)
  {
    list($width, $height, $type, $attr) = getimagesize($src);
    $imageinfo = [
      'width'=>$width,
      'height'=>$height,
      'type'=>image_type_to_extension($type,false),
      'attr'=>$attr
    ];
    $fun = "imagecreatefrom".$imageinfo['type'];
    $image = $fun($src);
    $image = Img::thumpImage($imageinfo, $image);
    return $image;
  }
  /**
   * 内部：操作图片
   */
  public static function thumpImage($imageinfo, $image)
  {
    $new_width = $imageinfo['width'] * 1;
    $new_height = $imageinfo['height'] * 1;
    $image_thump = imagecreatetruecolor($new_width,$new_height);
    //将原图复制带图片载体上面，并且按照一定比例压缩,极大的保持了清晰度
    imagecopyresampled($image_thump,$image,0,0,0,0,$new_width,$new_height,$imageinfo['width'],$imageinfo['height']);
    imagedestroy($image);
    $image = $image_thump;
    return $image;
  }
  /**
   * 输出图片:保存图片则用saveImage()
   */
  public static function showImage()
  {
    header('Content-Type: image/'.$imageinfo['type']);
    $funcs = "image".$imageinfo['type'];
    $funcs($image);
  }
  /**
   * 保存图片到硬盘：
   * @param string $dstImgName 、可指定字符串不带后缀的名称，使用源图扩展名 。、直接指定目标图片名带扩展名。
   */
  public static function saveImage($dstImgName, $image)
  {
    $funcs = "imagepng";
    $funcs($image,$dstImgName);
  }
}
